home *** CD-ROM | disk | FTP | other *** search
- Subject: v06i019: Patches for more/less interoperability (less.patch)
- Newsgroups: mod.sources
- Approved: rs@mirror.UUCP
-
- Submitted by: talcott!topaz!lll-crg!csustan!casey
- Mod.sources: Volume 6, Issue 19
- Archive-name: less.path
-
- [ This posting contains a couple of features designed to have less and
- more "interoperate" more easily. I have edited the prolog Casey
- sent with his submission. In the next couple of paragraphs, read "I"
- as "Leith (Casey) Leedom," not "Rich $alz." --r$]
-
- I modified less to accept a command line parameter of the form "-number",
- used to change the window scrolling size. Some programs pass this on to
- more, so I added it for compatibility. This is reflected in the updated
- manual page.
-
- Not all programs that use a pager (e.g., man in the August seismo BSD2.9
- distribution) refer to the $PAGER environment variable. I therefore
- wrote a small program designed to supplant /usr/ucb/more, or whatever
- the local pager is. It looks for $PAGER, and executes the indicated
- program with the passed parameters, othherwise, it executes the default
- pager (moved to somewhere else, like /usr/ucb/More) with the passed
- parameters.
-
- Also included are new versions of the makefiles, modified for pager_patch.
- I've also included new versions of all the makefiles (only slightly
- modified). The makefiles for Xenix and SYSV should be fixed to indicate
- where Xenix and SYSV keep their standard pagers (I have no idea myself) - as
- of now, they're both set to /usr/ucb/more. "Make pager_patch" will make
- the pager patch; "make install_pager_patch" will move the OLD_PAGER to
- OLD_PAGER_NEW_LOCATION and install the pager patch in OLD_PAGER.
-
- Leith (Casey) Leedom lll-crg.arpa!csustan!casey
- Computer Science Department work: (209) 667-3185
- California State University, Stanislaus home: (209) 634-2775
- Turlock, CA 95380
-
- -------------------- cut here --------------------
- #! /bin/sh
- # This is a shell archive, meaning:
- # 1. Remove everything above the #! /bin/sh line.
- # 2. Save the resulting text in a file.
- # 3. Execute the file with /bin/sh (not csh) to create:
- # option.c
- # screen.c
- # command.c
- # less.l
- # pager_patch.c
- # makefile.bsd41
- # makefile.bsd42
- # makefile.sys5
- # makefile.xen
- # This archive created: Fri May 30 00:03:32 1986
- export PATH; PATH=/bin:/usr/bin:$PATH
- if test -f 'option.c'
- then
- echo shar: "will not over-write existing file 'option.c'"
- else
- cat << \SHAR_EOF > 'option.c'
- /*
- * Process command line options.
- * Each option is a single letter which controls a program variable.
- * The options have defaults which may be changed via
- * the command line option, or toggled via the "-" command.
- */
-
- #include "less.h"
-
- #define toupper(c) ((c)-'a'+'A')
-
- /*
- * Types of options.
- */
- #define BOOL 01 /* Boolean option: 0 or 1 */
- #define TRIPLE 02 /* Triple-valued option: 0, 1 or 2 */
- #define NUMBER 04 /* Numeric option */
- #define NO_TOGGLE 0100 /* Option cannot be toggled with "-" cmd */
-
- /*
- * Variables controlled by command line options.
- */
- public int p_nbufs, f_nbufs; /* Number of buffers. There are two values,
- one used for input from a pipe and
- the other for input from a file. */
- public int clean_data; /* Can we assume the data is "clean"?
- (That is, free of nulls, etc) */
- public int quiet; /* Should we suppress the audible bell? */
- public int top_search; /* Should forward searches start at the top
- of the screen? (alternative is bottom) */
- public int top_scroll; /* Repaint screen from top?
- (alternative is scroll from bottom) */
- public int pr_type; /* Type of prompt (short, medium, long) */
- public int bs_mode; /* How to process backspaces */
- public int know_dumb; /* Don't complain about dumb terminals */
- public int quit_at_eof; /* Quit after hitting end of file twice */
- public int squeeze; /* Squeeze multiple blank lines into one */
- public int tabstop; /* Tab settings */
- public int back_scroll; /* Repaint screen on backwards movement */
- public int twiddle; /* Display "~" for lines after EOF */
-
- extern int nbufs;
- extern int sc_window;
- extern char *first_cmd;
- extern char *every_first_cmd;
-
- #define DEF_F_NBUFS 5 /* Default for f_nbufs */
- #define DEF_P_NBUFS 12 /* Default for p_nbufs */
-
- static struct option
- {
- char oletter; /* The controlling letter (a-z) */
- char otype; /* Type of the option */
- int odefault; /* Default value */
- int *ovar; /* Pointer to the associated variable */
- char *odesc[3]; /* Description of each value */
- } option[] =
- {
- { 'c', BOOL, 0, &clean_data,
- { "Don't assume data is clean",
- "Assume data is clean",
- NULL
- }
- },
- { 'd', BOOL|NO_TOGGLE, 0, &know_dumb,
- { NULL, NULL, NULL}
- },
- { 'e', BOOL, 0, &quit_at_eof,
- { "Don't quit at end-of-file",
- "Quit at end-of-file",
- NULL
- }
- },
- { 'h', NUMBER, -1, &back_scroll,
- { "Backwards scroll limit is %d lines",
- NULL, NULL
- }
- },
- { 'p', BOOL, 0, &top_scroll,
- { "Repaint by scrolling from bottom of screen",
- "Repaint by painting from top of screen",
- NULL
- }
- },
- { 'x', NUMBER, 8, &tabstop,
- { "Tab stops every %d spaces",
- NULL, NULL
- }
- },
- { 's', BOOL, 0, &squeeze,
- { "Don't squeeze multiple blank lines",
- "Squeeze multiple blank lines",
- NULL
- }
- },
- { 't', BOOL, 1, &top_search,
- { "Forward search starts from bottom of screen",
- "Forward search starts from top of screen",
- NULL
- }
- },
- { 'w', BOOL, 1, &twiddle,
- { "Display nothing for lines after end-of-file",
- "Display ~ for lines after end-of-file",
- NULL
- }
- },
- { 'm', TRIPLE, 0, &pr_type,
- { "Prompt with a colon",
- "Prompt with a message",
- "Prompt with a verbose message"
- }
- },
- { 'q', TRIPLE, 0, &quiet,
- { "Ring the bell for errors AND at eof/bof",
- "Ring the bell for errors but not at eof/bof",
- "Never ring the bell"
- }
- },
- { 'u', TRIPLE, 0, &bs_mode,
- { "Underlined text displayed in underline mode",
- "All backspaces cause overstrike",
- "Backspaces print as ^H"
- }
- },
- { 'z', NUMBER, 24, &sc_window,
- { "Scroll window size is %d lines",
- NULL, NULL
- }
- },
- { '\0' }
- };
-
- public char all_options[64]; /* List of all valid options */
-
- /*
- * Initialize each option to its default value.
- */
- public void
- init_option()
- {
- register struct option *o;
- register char *p;
-
- /*
- * First do special cases, not in option table.
- */
- first_cmd = every_first_cmd = NULL;
- f_nbufs = DEF_F_NBUFS; /* -bf */
- p_nbufs = DEF_P_NBUFS; /* -bp */
-
- p = all_options;
- *p++ = 'b';
-
- for (o = option; o->oletter != '\0'; o++)
- {
- /*
- * Set each variable to its default.
- * Also make a list of all options, in "all_options".
- */
- *(o->ovar) = o->odefault;
- *p++ = o->oletter;
- if (o->otype & TRIPLE)
- *p++ = toupper(o->oletter);
- }
- *p = '\0';
- }
-
- /*
- * Toggle command line flags from within the program.
- * Used by the "-" command.
- */
- public void
- toggle_option(c)
- int c;
- {
- register struct option *o;
- char message[100];
- char buf[5];
-
- /*
- * First check for special cases not handled by the option table.
- */
- switch (c)
- {
- case 'b':
- sprintf(message, "%d buffers", nbufs);
- error(message);
- return;
- }
-
-
- for (o = option; o->oletter != '\0'; o++)
- {
- if ((o->otype & BOOL) && (o->oletter == c) &&
- (o->otype & NO_TOGGLE) == 0)
- {
- /*
- * Boolean option:
- * just toggle it.
- */
- *(o->ovar) = ! *(o->ovar);
- error(o->odesc[*(o->ovar)]);
- return;
- } else if ((o->otype & TRIPLE) && (o->oletter == c) &&
- (o->otype & NO_TOGGLE) == 0)
- {
- /*
- * Triple-valued option with lower case letter:
- * make it 1 unless already 1, then make it 0.
- */
- *(o->ovar) = (*(o->ovar) == 1) ? 0 : 1;
- error(o->odesc[*(o->ovar)]);
- return;
- } else if ((o->otype & TRIPLE) && (toupper(o->oletter) == c) &&
- (o->otype & NO_TOGGLE) == 0)
- {
- /*
- * Triple-valued option with upper case letter:
- * make it 2 unless already 2, then make it 0.
- */
- *(o->ovar) = (*(o->ovar) == 2) ? 0 : 2;
- error(o->odesc[*(o->ovar)]);
- return;
- } else if ((o->otype & NUMBER) && (o->oletter == c) &&
- (o->otype & NO_TOGGLE) == 0)
- {
- sprintf(message, o->odesc[0], *(o->ovar));
- error(message);
- return;
- }
- }
-
- if (control_char(c))
- sprintf(buf, "^%c", carat_char(c));
- else
- sprintf(buf, "%c", c);
- sprintf(message, "\"-%s\": no such flag. Use one of \"%s\"",
- buf, all_options);
- error(message);
- }
-
- /*
- * Scan an argument (either from command line or from LESS environment
- * variable) and process it.
- */
- public void
- scan_option(s)
- char *s;
- {
- register struct option *o;
- register int c;
-
- if (s == NULL)
- return;
-
- next:
- if (*s == '\0')
- return;
- switch (c = *s++)
- {
- case '-':
- case ' ':
- case '\t':
- goto next;
- case '+':
- if (*s == '+')
- every_first_cmd = ++s;
- first_cmd = s;
- return;
- case 'b':
- switch (*s)
- {
- case 'f':
- s++;
- f_nbufs = getnum(&s, 'b');
- break;
- case 'p':
- s++;
- p_nbufs = getnum(&s, 'b');
- break;
- default:
- f_nbufs = p_nbufs = getnum(&s, 'b');
- break;
- }
- goto next;
- case '0': case '1': case '2': case '3': case '4':
- case '5': case '6': case '7': case '8': case '9':
- {
- /*
- * Handle special "more" compatibility form "-number"
- * to set the scrolling window size.
- */
- s--;
- sc_window = getnum(&s, '-');
- goto next;
- }
- }
-
- for (o = option; o->oletter != '\0'; o++)
- {
- if ((o->otype & BOOL) && (o->oletter == c))
- {
- *(o->ovar) = ! o->odefault;
- goto next;
- } else if ((o->otype & TRIPLE) && (o->oletter == c))
- {
- *(o->ovar) = (o->odefault == 1) ? 0 : 1;
- goto next;
- } else if ((o->otype & TRIPLE) && (toupper(o->oletter) == c))
- {
- *(o->ovar) = (o->odefault == 2) ? 0 : 2;
- goto next;
- } else if ((o->otype & NUMBER) && (o->oletter == c))
- {
- *(o->ovar) = getnum(&s, c);
- goto next;
- }
- }
-
- printf("\"-%c\": invalid flag\n", c);
- exit(1);
- }
-
- /*
- * Translate a string into a number.
- * Like atoi(), but takes a pointer to a char *, and updates
- * the char * to point after the translated number.
- */
- static int
- getnum(sp, c)
- char **sp;
- int c;
- {
- register char *s;
- register int n;
-
- s = *sp;
- if (*s < '0' || *s > '9')
- {
- printf("number is required after -%c\n", c);
- exit(1);
- }
-
- n = 0;
- while (*s >= '0' && *s <= '9')
- n = 10 * n + *s++ - '0';
- *sp = s;
- return (n);
- }
- SHAR_EOF
- fi
- if test -f 'screen.c'
- then
- echo shar: "will not over-write existing file 'screen.c'"
- else
- cat << \SHAR_EOF > 'screen.c'
- /*
- * Routines which deal with the characteristics of the terminal.
- * Uses termcap to be as terminal-independent as possible.
- *
- * {{ Someday this should be rewritten to use curses. }}
- */
-
- #include "less.h"
- #if XENIX
- #include <sys/types.h>
- #include <sys/ioctl.h>
- #endif
-
- #if TERMIO
- #include <termio.h>
- #else
- #include <sgtty.h>
- #endif
-
- /*
- * Strings passed to tputs() to do various terminal functions.
- */
- static char
- *sc_pad, /* Pad string */
- *sc_home, /* Cursor home */
- *sc_addline, /* Add line, scroll down following lines */
- *sc_lower_left, /* Cursor to last line, first column */
- *sc_move, /* General cursor positioning */
- *sc_clear, /* Clear screen */
- *sc_eol_clear, /* Clear to end of line */
- *sc_s_in, /* Enter standout (highlighted) mode */
- *sc_s_out, /* Exit standout mode */
- *sc_u_in, /* Enter underline mode */
- *sc_u_out, /* Exit underline mode */
- *sc_visual_bell, /* Visual bell (flash screen) sequence */
- *sc_backspace, /* Backspace cursor */
- *sc_init, /* Startup terminal initialization */
- *sc_deinit; /* Exit terminal de-intialization */
- static int dumb;
- static int hard;
-
- public int auto_wrap; /* Terminal does \r\n when write past margin */
- public int ignaw; /* Terminal ignores \n immediately after wrap */
- public int erase_char, kill_char; /* The user's erase and line-kill chars */
- public int sc_width, sc_height; /* Height & width of screen */
- public int sc_window = -1; /* window size for forward and backward */
- public int ul_width, ue_width; /* Printing width of underline sequences */
- public int so_width, se_width; /* Printing width of standout sequences */
-
- /*
- * These two variables are sometimes defined in,
- * and needed by, the termcap library.
- * It may be necessary on some systems to declare them extern here.
- */
- /*extern*/ short ospeed; /* Terminal output baud rate */
- /*extern*/ char PC; /* Pad character */
-
- extern int quiet; /* If VERY_QUIET, use visual bell for bell */
- extern int know_dumb; /* Don't complain about a dumb terminal */
- extern int back_scroll;
- char *tgetstr();
- char *tgoto();
-
- /*
- * Change terminal to "raw mode", or restore to "normal" mode.
- * "Raw mode" means
- * 1. An outstanding read will complete on receipt of a single keystroke.
- * 2. Input is not echoed.
- * 3. On output, \n is mapped to \r\n.
- * 4. \t is NOT be expanded into spaces.
- * 5. Signal-causing characters such as ctrl-C (interrupt),
- * etc. are NOT disabled.
- * It doesn't matter whether an input \n is mapped to \r, or vice versa.
- */
- public void
- raw_mode(on)
- int on;
- {
- #if TERMIO
- struct termio s;
- static struct termio save_term;
-
- if (on)
- {
- /*
- * Get terminal modes.
- */
- ioctl(2, TCGETA, &s);
-
- /*
- * Save modes and set certain variables dependent on modes.
- */
- save_term = s;
- ospeed = s.c_cflag & CBAUD;
- erase_char = s.c_cc[VERASE];
- kill_char = s.c_cc[VKILL];
-
- /*
- * Set the modes to the way we want them.
- */
- s.c_lflag &= ~(ICANON|ECHO|ECHOE|ECHOK|ECHONL);
- s.c_oflag |= (OPOST|ONLCR|TAB3);
- s.c_oflag &= ~(OCRNL|ONOCR|ONLRET);
- s.c_cc[VMIN] = 1;
- s.c_cc[VTIME] = 0;
- } else
- {
- /*
- * Restore saved modes.
- */
- s = save_term;
- }
- ioctl(2, TCSETAW, &s);
- #else
- struct sgttyb s;
- static struct sgttyb save_term;
-
- if (on)
- {
- /*
- * Get terminal modes.
- */
- ioctl(2, TIOCGETP, &s);
-
- /*
- * Save modes and set certain variables dependent on modes.
- */
- save_term = s;
- ospeed = s.sg_ospeed;
- erase_char = s.sg_erase;
- kill_char = s.sg_kill;
-
- /*
- * Set the modes to the way we want them.
- */
- s.sg_flags |= CBREAK;
- s.sg_flags &= ~(ECHO|XTABS);
- } else
- {
- /*
- * Restore saved modes.
- */
- s = save_term;
- }
- ioctl(2, TIOCSETN, &s);
- #endif
- }
-
- static int couldnt = 0;
-
- static void
- cannot(s)
- char *s;
- {
- if (know_dumb)
- /*
- * He knows he has a dumb terminal, so don't tell him.
- */
- return;
-
- printf("WARNING: terminal cannot \"%s\"\n", s);
- couldnt = 1;
- }
-
- /*
- * Get terminal capabilities via termcap.
- */
- public void
- get_term()
- {
- char termbuf[1024];
- char *sp;
- static char sbuf[150];
-
- char *getenv();
-
- /*
- * Find out what kind of terminal this is.
- */
- if (tgetent(termbuf, getenv("TERM")) <= 0)
- dumb = 1;
-
- /*
- * Get size of the screen.
- */
- if (dumb || (sc_height = tgetnum("li")) < 0 || tgetflag("hc"))
- {
- /* Oh no, this is a hardcopy terminal. */
- hard = 1;
- sc_height = 24;
- }
- /*
- * This is terrible - the following if "knows" that it is being
- * executed *after* command line and environment options have
- * already been parsed. Should it be executed in the main program
- * instead?
- */
- if ((sc_window <= 0) || (sc_window >= sc_height))
- sc_window = sc_height-1;
- if (dumb || (sc_width = tgetnum("co")) < 0)
- sc_width = 80;
-
- auto_wrap = tgetflag("am");
- ignaw = tgetflag("xn");
-
- /*
- * Assumes termcap variable "sg" is the printing width of
- * the standout sequence, the end standout sequence,
- * the underline sequence, and the end underline sequence.
- */
- if ((ul_width = tgetnum("sg")) < 0)
- ul_width = 0;
- so_width = se_width = ue_width = ul_width;
-
- /*
- * Get various string-valued capabilities.
- */
- sp = sbuf;
-
- sc_pad = (dumb) ? NULL : tgetstr("pc", &sp);
- if (sc_pad != NULL)
- PC = *sc_pad;
-
- sc_init = (dumb) ? NULL : tgetstr("ti", &sp);
- if (sc_init == NULL)
- sc_init = "";
-
- sc_deinit= (dumb) ? NULL : tgetstr("te", &sp);
- if (sc_deinit == NULL)
- sc_deinit = "";
-
- sc_eol_clear = (dumb) ? NULL : tgetstr("ce", &sp);
- if (hard || sc_eol_clear == NULL || *sc_eol_clear == '\0')
- {
- cannot("clear to end of line");
- sc_eol_clear = "";
- }
-
- sc_clear = (dumb) ? NULL : tgetstr("cl", &sp);
- if (hard || sc_clear == NULL || *sc_clear == '\0')
- {
- cannot("clear screen");
- sc_clear = "\n\n";
- }
-
- sc_move = (dumb) ? NULL : tgetstr("cm", &sp);
- if (hard || sc_move == NULL || *sc_move == '\0')
- {
- /*
- * This is not an error here, because we don't
- * always need sc_move.
- * We need it only if we don't have home or lower-left.
- */
- sc_move = "";
- }
-
- sc_s_in = (dumb) ? NULL : tgetstr("so", &sp);
- if (hard || sc_s_in == NULL)
- sc_s_in = "";
-
- sc_s_out = (dumb) ? NULL : tgetstr("se", &sp);
- if (hard || sc_s_out == NULL)
- sc_s_out = "";
-
- sc_u_in = (dumb) ? NULL : tgetstr("us", &sp);
- if (hard || sc_u_in == NULL)
- sc_u_in = sc_s_in;
-
- sc_u_out = (dumb) ? NULL : tgetstr("ue", &sp);
- if (hard || sc_u_out == NULL)
- sc_u_out = sc_s_out;
-
- sc_visual_bell = (dumb) ? NULL : tgetstr("vb", &sp);
- if (hard || sc_visual_bell == NULL)
- sc_visual_bell = "";
-
- sc_home = (dumb) ? NULL : tgetstr("ho", &sp);
- if (hard || sc_home == NULL || *sc_home == '\0')
- {
- if (*sc_move == '\0')
- {
- cannot("home cursor");
- /*
- * This last resort for sc_home is supposed to
- * be an up-arrow suggesting moving to the
- * top of the "virtual screen". (The one in
- * your imagination as you try to use this on
- * a hard copy terminal.)
- */
- sc_home = "|\b^";
- } else
- {
- /*
- * No "home" string,
- * but we can use "move(0,0)".
- */
- strcpy(sp, tgoto(sc_move, 0, 0));
- sc_home = sp;
- sp += strlen(sp) + 1;
- }
- }
-
- sc_lower_left = (dumb) ? NULL : tgetstr("ll", &sp);
- if (hard || sc_lower_left == NULL || *sc_lower_left == '\0')
- {
- if (*sc_move == '\0')
- {
- cannot("move cursor to lower left of screen");
- sc_lower_left = "\r";
- } else
- {
- /*
- * No "lower-left" string,
- * but we can use "move(0,last-line)".
- */
- strcpy(sp, tgoto(sc_move, 0, sc_height-1));
- sc_lower_left = sp;
- sp += strlen(sp) + 1;
- }
- }
-
- /*
- * To add a line at top of screen and scroll the display down,
- * we use "al" (add line) or "sr" (scroll reverse).
- */
- if (dumb)
- sc_addline = NULL;
- else if ((sc_addline = tgetstr("al", &sp)) == NULL ||
- *sc_addline == '\0')
- sc_addline = tgetstr("sr", &sp);
-
- if (hard || sc_addline == NULL || *sc_addline == '\0')
- {
- cannot("scroll backwards");
- sc_addline = "";
- /* Force repaint on any backward movement */
- back_scroll = 0;
- }
-
- if (dumb || tgetflag("bs"))
- sc_backspace = "\b";
- else
- {
- sc_backspace = tgetstr("bc", &sp);
- if (sc_backspace == NULL || *sc_backspace == '\0')
- sc_backspace = "\b";
- }
-
- if (couldnt)
- /* Give him time to read all the "cannot" messages. */
- error("");
- }
-
-
- /*
- * Below are the functions which perform all the
- * terminal-specific screen manipulation.
- */
-
-
- /*
- * Initialize terminal
- */
- public void
- init()
- {
- tputs(sc_init, sc_height, putc);
- }
-
- /*
- * Deinitialize terminal
- */
- public void
- deinit()
- {
- tputs(sc_deinit, sc_height, putc);
- }
-
- /*
- * Home cursor (move to upper left corner of screen).
- */
- public void
- home()
- {
- tputs(sc_home, 1, putc);
- }
-
- /*
- * Add a blank line (called with cursor at home).
- * Should scroll the display down.
- */
- public void
- add_line()
- {
- tputs(sc_addline, sc_height, putc);
- }
-
- /*
- * Move cursor to lower left corner of screen.
- */
- public void
- lower_left()
- {
- tputs(sc_lower_left, 1, putc);
- }
-
- /*
- * Ring the terminal bell.
- */
- public void
- bell()
- {
- if (quiet == VERY_QUIET)
- vbell();
- else
- putc('\7');
- }
-
- /*
- * Output the "visual bell", if there is one.
- */
- public void
- vbell()
- {
- if (*sc_visual_bell == '\0')
- return;
- tputs(sc_visual_bell, sc_height, putc);
- }
-
- /*
- * Clear the screen.
- */
- public void
- clear()
- {
- tputs(sc_clear, sc_height, putc);
- }
-
- /*
- * Clear from the cursor to the end of the cursor's line.
- * {{ This must not move the cursor. }}
- */
- public void
- clear_eol()
- {
- tputs(sc_eol_clear, 1, putc);
- }
-
- /*
- * Begin "standout" (bold, underline, or whatever).
- */
- public void
- so_enter()
- {
- tputs(sc_s_in, 1, putc);
- }
-
- /*
- * End "standout".
- */
- public void
- so_exit()
- {
- tputs(sc_s_out, 1, putc);
- }
-
- /*
- * Begin "underline" (hopefully real underlining,
- * otherwise whatever the terminal provides).
- */
- public void
- ul_enter()
- {
- tputs(sc_u_in, 1, putc);
- }
-
- /*
- * End "underline".
- */
- public void
- ul_exit()
- {
- tputs(sc_u_out, 1, putc);
- }
-
- /*
- * Erase the character to the left of the cursor
- * and move the cursor left.
- */
- public void
- backspace()
- {
- /*
- * Try to erase the previous character by overstriking with a space.
- */
- tputs(sc_backspace, 1, putc);
- putc(' ');
- tputs(sc_backspace, 1, putc);
- }
-
- /*
- * Output a plain backspace, without erasing the previous char.
- */
- public void
- putbs()
- {
- tputs(sc_backspace, 1, putc);
- }
- SHAR_EOF
- fi
- if test -f 'command.c'
- then
- echo shar: "will not over-write existing file 'command.c'"
- else
- cat << \SHAR_EOF > 'command.c'
- /*
- * User-level command processor.
- */
-
- #include "less.h"
- #include "position.h"
- #include <setjmp.h>
-
- extern jmp_buf main_loop;
- extern int erase_char, kill_char;
- extern int pr_type;
- extern int sigs;
- extern int ispipe;
- extern int quit_at_eof;
- extern int hit_eof;
- extern int sc_width, sc_height;
- extern int sc_window;
- extern char *first_cmd;
- extern char version[];
- extern char current_file[];
- extern char *editor;
-
- static char cmdbuf[90]; /* Buffer for holding a multi-char command */
- static char *cp; /* Pointer into cmdbuf */
- static int cmd_col; /* Current column of the multi-char command */
- static char mcc; /* The multi-char command letter (e.g. '/') */
- static char last_mcc; /* The previous mcc */
-
- /*
- * Reset command buffer (to empty).
- */
- cmd_reset()
- {
- cp = cmdbuf;
- }
-
- /*
- * Backspace in command buffer.
- */
- static int
- cmd_erase()
- {
- if (cp == cmdbuf)
- /*
- * Backspace past beginning of the string:
- * this usually means abort the command.
- */
- return (1);
-
- if (control_char(*--cp))
- {
- /*
- * Erase an extra character, for the carat.
- */
- backspace();
- cmd_col--;
- }
- backspace();
- cmd_col--;
- return (0);
- }
-
- /*
- * Set up the display to start a new multi-character command.
- */
- start_mcc()
- {
- lower_left();
- clear_eol();
- putc(mcc);
- cmd_col = 1;
- }
-
- /*
- * Process a single character of a multi-character command, such as
- * a number, or the pattern of a search command.
- */
- static int
- cmd_char(c)
- int c;
- {
- if (c == erase_char)
- {
- if (cmd_erase())
- return (1);
- } else if (c == kill_char)
- {
- /* {{ Could do this faster, but who cares? }} */
- while (cmd_erase() == 0)
- ;
- } else
- {
- /*
- * Append the character to the string,
- * if there is room in the buffer and on the screen.
- */
- if (cp < &cmdbuf[sizeof(cmdbuf)-1] && cmd_col < sc_width-3)
- {
- *cp++ = c;
- if (control_char(c))
- {
- putc('^');
- cmd_col++;
- c = carat_char(c);
- }
- putc(c);
- cmd_col++;
- } else
- bell();
- }
- return (0);
- }
-
- /*
- * Return the number currently in the command buffer.
- */
- static int
- cmd_int()
- {
- *cp = '\0';
- cp = cmdbuf;
- return (atoi(cmdbuf));
- }
-
- /*
- * Move the cursor to lower left before executing a command.
- * This looks nicer if the command takes a long time before
- * updating the screen.
- */
- static void
- cmd_exec()
- {
- lower_left();
- flush();
- }
-
- /*
- * Display the appropriate prompt.
- */
- static void
- prompt()
- {
- register char *p;
-
- if (first_cmd != NULL && *first_cmd != '\0')
- /*
- * No prompt necessary if commands are from first_cmd
- * rather than from the user.
- */
- return;
-
- /*
- * Select the proper prompt and display it.
- */
- p = pr_string();
- if (p == NULL)
- putc(':');
- else
- {
- so_enter();
- puts(p);
- so_exit();
- }
- }
-
- /*
- * Get command character.
- * The character normally comes from the keyboard,
- * but may come from the "first_cmd" string.
- */
- static int
- getcc()
- {
- if (first_cmd == NULL)
- return (getc());
-
- if (*first_cmd == '\0')
- {
- /*
- * Reached end of first_cmd input.
- */
- first_cmd = NULL;
- if (cp > cmdbuf && position(TOP) == NULL_POSITION)
- {
- /*
- * Command is incomplete, so try to complete it.
- * There are only two cases:
- * 1. We have "/string" but no newline. Add the \n.
- * 2. We have a number but no command. Treat as #g.
- * (This is all pretty hokey.)
- */
- if (mcc != ':')
- return ('\n');
- else
- return ('g');
- }
- return (getc());
- }
- return (*first_cmd++);
- }
-
- /*
- * Main command processor.
- * Accept and execute commands until a quit command, then return.
- */
- public void
- commands()
- {
- register int c;
- register int n;
- register int scroll = 10;
-
- mcc = last_mcc = 0;
-
- setjmp(main_loop);
- for (;;)
- {
- /*
- * Display prompt and accept a character.
- */
- psignals(); /* See if any signals need processing */
-
- if (quit_at_eof && hit_eof > 1)
- /*
- * After hitting end-of-file for the second time,
- * automatically advance to the next file.
- * If there are no more files, quit.
- */
- next_file(1);
-
- cmd_reset();
- lower_left();
- clear_eol();
- prompt();
- c = getcc();
-
- again:
- if (sigs)
- continue;
-
- if (mcc)
- {
- /*
- * We are in a multi-character command.
- * All chars until newline go into the command buffer.
- * (Note that mcc == ':' is a special case that
- * means a number is being entered.)
- */
- if (mcc != ':' && (c == '\n' || c == '\r'))
- {
- /*
- * Execute the command.
- */
- *cp = '\0';
- cmd_exec();
- if (mcc == 'E')
- {
- char *p;
- /*
- * Ignore leading spaces
- * in the filename.
- */
- for (p = cmdbuf; *p == ' '; p++) ;
- edit(p);
- #if SHELL_ESCAPE
- } else if (mcc == '!')
- {
- lsystem(cmdbuf);
- error("!done");
- first_cmd = "r"; /* Repaint */
- #endif
- } else
- search(mcc, cmdbuf, n);
- mcc = 0;
- } else
- {
- if (mcc == ':' && (c < '0' || c > '9') &&
- c != erase_char && c != kill_char)
- {
- /*
- * This is not part of the number
- * we were entering. Process
- * it as a regular character.
- */
- mcc = 0;
- goto again;
- }
-
- /*
- * Append the char to the command buffer.
- */
- if (cmd_char(c))
- {
- /* Abort the multi-char command. */
- mcc = 0;
- continue;
- }
- c = getcc();
- goto again;
- }
- } else switch (c)
- {
- case '0': case '1': case '2': case '3': case '4':
- case '5': case '6': case '7': case '8': case '9':
- /*
- * First digit of a number.
- */
- mcc = ':';
- start_mcc();
- goto again;
-
- case 'f':
- case ' ':
- case CONTROL('F'):
- /*
- * Forward one screen.
- */
- n = cmd_int();
- if (n <= 0)
- n = sc_window;
- forward(n, 1);
- break;
-
- case 'b':
- case CONTROL('B'):
- /*
- * Backward one screen.
- */
- n = cmd_int();
- if (n <= 0)
- n = sc_window;
- backward(n, 1);
- break;
-
- case 'e':
- case 'j':
- case '\r':
- case '\n':
- case CONTROL('E'):
- /*
- * Forward N (default 1) line.
- */
- n = cmd_int();
- if (n <= 0)
- n = 1;
- forward(n, 0);
- break;
-
- case 'y':
- case 'k':
- case CONTROL('K'):
- case CONTROL('Y'):
- /*
- * Backward N (default 1) line.
- */
- n = cmd_int();
- if (n <= 0)
- n = 1;
- backward(n, 0);
- break;
-
- case 'd':
- case CONTROL('D'):
- /*
- * Forward N lines
- * (default same as last 'd' or 'u' command).
- */
- n = cmd_int();
- if (n > 0)
- scroll = n;
- forward(scroll, 0);
- break;
-
- case 'u':
- case CONTROL('U'):
- /*
- * Forward N lines
- * (default same as last 'd' or 'u' command).
- */
- n = cmd_int();
- if (n > 0)
- scroll = n;
- backward(scroll, 0);
- break;
-
- case 'R':
- /*
- * Flush buffers, then repaint screen.
- */
- ch_init(0);
- /* Fall thru */
- case 'r':
- case CONTROL('R'):
- case CONTROL('L'):
- /*
- * Repaint screen.
- */
- repaint();
- break;
-
- case 'g':
- /*
- * Go to line N, default beginning of file.
- */
- n = cmd_int();
- if (n <= 0)
- n = 1;
- cmd_exec();
- jump_back(n);
- break;
-
- case 'p':
- case '%':
- /*
- * Go to a specified percentage into the file.
- */
- n = cmd_int();
- if (n < 0)
- n = 0;
- if (n > 100)
- n = 100;
- cmd_exec();
- jump_percent(n);
- break;
-
- case 'G':
- /*
- * Go to line N, default end of file.
- */
- n = cmd_int();
- cmd_exec();
- if (n <= 0)
- jump_forw();
- else
- jump_back(n);
- break;
-
- case '=':
- case CONTROL('G'):
- /*
- * Print file name, etc.
- */
- error(eq_message());
- break;
-
- case 'V':
- /*
- * Print version number, without the "@(#)".
- */
- error(version+4);
- break;
-
- case 'q':
- /*
- * Exit.
- */
- return;
-
- case '/':
- case '?':
- /*
- * Search for a pattern.
- * Accept chars of the pattern until \n.
- */
- n = cmd_int();
- if (n <= 0)
- n = 1;
- mcc = last_mcc = c;
- start_mcc();
- c = getcc();
- goto again;
-
- case 'n':
- /*
- * Repeat previous search.
- */
- n = cmd_int();
- if (n <= 0)
- n = 1;
- mcc = last_mcc;
- start_mcc();
- cmd_exec();
- search(mcc, (char *)NULL, n);
- mcc = 0;
- break;
-
- case 'h':
- /*
- * Help.
- */
- help();
- repaint();
- break;
-
- case 'E':
- /*
- * Edit a new file. Get the filename.
- */
- cmd_reset();
- mcc = 'E';
- start_mcc();
- puts("dit: "); /* This looks nicer */
- cmd_col += 5;
- c = getcc();
- goto again;
-
- #if SHELL_ESCAPE
- case '!':
- /*
- * Shell escape.
- */
- cmd_reset();
- mcc = '!';
- start_mcc();
- c = getcc();
- goto again;
- #endif
-
- #if EDITOR
- case 'v':
- if (ispipe)
- {
- error("Cannot edit standard input");
- break;
- }
- sprintf(cmdbuf, "%s %s", editor, current_file);
- lsystem(cmdbuf);
- first_cmd = "R";
- break;
- #endif
-
- case 'N':
- /*
- * Examine next file.
- */
- n = cmd_int();
- if (n <= 0)
- n = 1;
- next_file(n);
- break;
-
- case 'P':
- /*
- * Examine previous file.
- */
- n = cmd_int();
- if (n <= 0)
- n = 1;
- prev_file(n);
- break;
-
- case '-':
- /*
- * Toggle a flag setting.
- */
- mcc = '-';
- start_mcc();
- c = getcc();
- mcc = 0;
- if (c == erase_char || c == kill_char)
- break;
- toggle_option(c);
- break;
-
- case 'm':
- /*
- * Set a mark.
- */
- lower_left();
- clear_eol();
- puts("mark: ");
- c = getcc();
- if (c == erase_char || c == kill_char)
- break;
- setmark(c);
- break;
-
- case '\'':
- /*
- * Go to a mark.
- */
- lower_left();
- clear_eol();
- puts("goto mark: ");
- c = getcc();
- if (c == erase_char || c == kill_char)
- break;
- gomark(c);
- break;
-
- default:
- bell();
- break;
- }
- }
- }
- SHAR_EOF
- fi
- if test -f 'less.l'
- then
- echo shar: "will not over-write existing file 'less.l'"
- else
- cat << \SHAR_EOF > 'less.l'
- .TH LESS l
- .SH NAME
- less \- opposite of more
- .SH SYNOPSIS
- .B "less [-cdepstwmMqQuU] [-h\fIn\fB] [-b[fp]\fIn\fB] [-x\fIn\fB] [-[z]\fIn\fB] [+\fIcmd\fB] [\fIname\fB] ..."
- .SH DESCRIPTION
- .I Less
- is a program similar to
- .I more
- (1), but which allows backwards movement
- in the file as well as forward movement.
- Also,
- .I less
- does not have to read the entire input file before starting,
- so with large input files it starts up faster than text editors like
- .I vi
- (1).
- .I Less
- uses termcap, so it can run on a variety of terminals.
- There is even limited support for hardcopy terminals.
- (On a hardcopy terminal, lines which should be printed at the top
- of the screen are prefixed with an up-arrow.)
- .PP
- Commands are based on both
- .I more
- and
- .I vi.
- Commands may be preceeded by a decimal number,
- called N in the descriptions below.
- The number is used by some commands, as indicated.
-
- .SH COMMANDS
- .IP h
- Help: display a summary of these commands.
- If you forget all the other commands, remember this one.
- .PP
- .IP SPACE
- Scroll forward N lines, default one window (see option z below).
- If N is more than the screen size, only one screenful is displayed.
- .PP
- .IP f
- Same as SPACE.
- .PP
- .IP b
- Scroll backward N lines, default one window (see option z below).
- If N is more than the screen size, only one screenful is displayed.
- .PP
- .IP RETURN
- Scroll forward N lines, default 1.
- If N is more than the screen size, the entire N lines are displayed.
- .PP
- .IP e
- Same as RETURN.
- .PP
- .IP j
- Also the same as RETURN.
- .PP
- .IP y
- Scroll backward N lines, default 1.
- If N is more than the screen size, the entire N lines are displayed.
- .IP k
- Same as y.
- .PP
- .IP d
- Scroll forward N lines, default 10.
- If N is specified, it becomes the new default for all d and u commands.
- .PP
- .IP u
- Scroll backward N lines, default 10.
- If N is specified, it becomes the new default for all d and u commands.
- .PP
- .IP r
- Repaint the screen.
- .PP
- .IP R
- Repaint the screen, discarding any buffered input.
- Useful if the file is changing while it is being viewed.
- .PP
- .IP g
- Go to line N in the file, default 1 (beginning of file).
- (Warning: this may be slow if N is large.)
- .PP
- .IP G
- Go to line N in the file, default the end of the file.
- (Warning: this may be slow if standard input,
- rather than a file, is being read.)
- .PP
- .IP p
- Go to a position N percent into the file.
- N should be between 0 and 100.
- (This is possible if standard input is being read,
- but only if
- .I less
- has already read to the end of the file.
- It is always fast, but not always useful.)
- .PP
- .IP %
- Same as p.
- .PP
- .IP m
- Followed by any lowercase letter, marks the current position with that letter.
- .PP
- .IP "'"
- Followed by any lowercase letter, returns to the position which
- was previously marked with that letter.
- All marks are lost when a new file is examined.
- .PP
- .IP /pattern
- Search forward in the file for the N-th occurence of the pattern.
- N defaults to 1.
- The pattern is a regular expression, as recognized by
- .I ed.
- The search starts at the second line displayed
- (but see the -t option, which changes this).
- .PP
- .IP ?pattern
- Search backward in the file for the N-th occurence of the pattern.
- The search starts at the line immediately before the top line displayed.
- .PP
- .IP n
- Repeat previous search, for N-th occurence of the last pattern.
- .PP
- .IP E [filename]
- Examine a new file.
- If the filename is missing, the "current" file (see the N and P commands
- below) from the list of files in the command line is re-examined.
- .PP
- .IP N
- Examine the next file (from the list of files given in the command line).
- If a number N is specified (not to be confused with the command N),
- the N-th next file is examined.
- .PP
- .IP P
- Examine the previous file.
- If a number N is specified, the N-th previous file is examined.
- .PP
- .IP =
- Prints the name of the file being viewed
- and the byte offset of the bottom line being displayed.
- If possible, it also prints the length of the file
- and the percent of the file above the last displayed line.
- .PP
- .IP \-
- Followed by one of the command line option letters (see below),
- this will toggle the setting of that option
- and print a message describing the new setting.
- .PP
- .IP V
- Prints the version number of
- .I less
- being run.
- .PP
- .IP q
- Exits
- .I less.
- .PP
- The following
- two
- commands may or may not be valid, depending on your particular installation.
- .PP
- .IP v
- Invokes an editor to edit the current file being viewed.
- The editor is taken from the environment variable EDITOR,
- or defaults to "vi".
- .PP
- .IP "! shell-command"
- Invokes a shell to run the shell-command given.
- .PP
- .SH OPTIONS
- Command line options are described below.
- Options are also taken from the environment variable "LESS".
- (The environment variable is parsed before the command line,
- so command line options override the LESS environment variable.
- Options may be changed while
- .I less
- is running via the "\-" command.)
- For example, if you like
- more-style prompting, to avoid typing "less -m ..." each time
- .I less
- is invoked, you might tell
- .I csh:
- .sp
- setenv LESS m
- .sp
- or if you use
- .I sh:
- .sp
- LESS=m; export LESS
- .IP -s
- The -s flag causes
- consecutive blank lines to be squeezed into a single blank line.
- This is useful when viewing
- .I nroff
- output.
- .IP -t
- Normally, forward searches start just after
- the top displayed line (that is, at the second displayed line).
- Thus forward searches include the currently displayed screen.
- The -t command line option causes forward searches to start
- just after the bottom line displayed,
- thus skipping the currently displayed screen.
- .IP -m
- Normally,
- .I less
- prompts with a colon.
- The -m command line option causes
- .I less
- to prompt verbosely like
- .I more,
- printing the file name and percent into the file.
- .IP -M
- The -M command line option causes
- .I less
- to prompt even more verbosely than
- .I more.
- .IP -q
- Normally, if an attempt is made to scroll past the end of the file
- or before the beginning of the file, the terminal bell is rung to
- indicate this fact.
- The -q command line option tells
- .I less
- not to ring the bell at such times.
- If the terminal has a "visual bell", it is used instead.
- .IP -Q
- Even if -q is given,
- .I less
- will ring the bell on certain other errors,
- such as typing an invalid character.
- The -Q command line option tells
- .I less
- to be quiet all the time; that is, never ring the terminal bell.
- If the terminal has a "visual bell", it is used instead.
- .IP -e
- Normally the only way to exit less is via the "q" command.
- The -e command line option tells less to automatically exit
- the second time it reaches end-of-file.
- .IP -u
- If the -u command line option is given,
- backspaces are treated as printable characters;
- that is, they are sent to the terminal when they appear in the input.
- .IP -U
- If the -U command line option is given,
- backspaces are printed as the two character sequence "^H".
- If neither -u nor -U is given,
- backspaces which appear adjacent to an underscore character
- are treated specially:
- the underlined text is displayed
- using the terminal's hardware underlining capability.
- .IP -w
- Normally,
- .I less
- uses a tilde character to represent lines past the end of the file.
- The -w option causes blank lines to be used instead.
- .IP -d
- Normally,
- .I less
- will complain if the terminal is dumb; that is, lacks some important capability,
- such as the ability to clear the screen or scroll backwards.
- The -d flag suppresses this complaint
- (but does not otherwise change the behavior of the program on a dumb terminal).
- .IP -p
- Normally,
- .I less
- will repaint the screen by scrolling from the bottom of the screen.
- If the -p flag is set, when
- .I less
- needs to change the entire display, it will clear the screen
- and paint from the top line down.
- .IP -h
- Normally,
- .I less
- will scroll backwards when backwards movement is necessary.
- The -h option specifies a maximum number of lines to scroll backwards.
- If it is necessary to move backwards more than this many lines,
- the screen is repainted in a forward direction.
- (If the terminal does not have the ability to scroll
- backwards, -h0 is implied.)
- .IP -[z]\fIn\fR
- When given a backwards or forwards window command,
- .I less
- will by default scroll backwards or forwards one screenful of lines.
- The -[z]\fIn\fR option changes the default scrolling window size
- to \fIn\fR lines.
- If \fIn\fR is greater than the screen size, the scrolling window size
- will be set to one screenful.
- Note that the z is optional for compatibility with more.
- .IP -x
- The -x\fIn\fR command line option sets tab stops every \fIn\fR positions.
- The default for \fIn\fR is 8.
- .IP -b
- The -b\fIn\fR command line option tells
- .I less
- to use a non-standard buffer size.
- There are two standard (default) buffer sizes,
- one is used when a file is being read and the other
- when a pipe (standard input) is being read.
- The current defaults are 5 buffers for files and 12 for pipes.
- (Buffers are 1024 bytes.)
- The number \fIn\fR specifies a different number of buffers to use.
- The -b may be followed by "f", in which case only
- the file default is changed, or by "p" in which case only the
- pipe default is changed. Otherwise, both are changed.
- .IP -c
- Normally, when data is read by
- .I less,
- it is scanned to ensure that bit 7 (the high order bit) is turned off in
- each byte read, and to ensure that there are no null (zero) bytes in
- the data (null bytes are turned into "@" characters).
- If the data is known to be "clean",
- the -c command line option will tell
- .I less
- to skip this checking, causing an imperceptible speed improvement.
- (However, if the data is not "clean", unpredicatable results may occur.)
- .IP +
- If a command line option begins with \fB+\fR,
- the remainder of that option is taken to be an initial command to
- .I less.
- For example, +G tells
- .I less
- to start at the end of the file rather than the beginning,
- and +/xyz tells it to start at the first occurence of "xyz" in the file.
- As a special case, +<number> acts like +<number>g;
- that is, it starts the display at the specified line number
- (however, see the caveat under the "g" command above).
- If the option starts with \fB++\fR, the initial command applies to
- every file being viewed, not just the first one.
-
- .SH BUGS
- When used on standard input (rather than a file), you can move
- backwards only a finite amount, corresponding to that portion
- of the file which is still buffered.
- SHAR_EOF
- fi
- if test -f 'pager_patch.c'
- then
- echo shar: "will not over-write existing file 'pager_patch.c'"
- else
- cat << \SHAR_EOF > 'pager_patch.c'
- /*
- * Special interface that checks for the environment variable PAGER. If
- * present, the program specified is executed, otherwise OLD_PAGER_NEW_LOCATION
- * (specified below). This program should replace /usr/ucb/more (or whatever
- * your default pager is) and more should be moved to OLD_PAGER_NEW_LOCATION.
- * This is essentially a fix for all the programs which *should* check for the
- * environment variable PAGER, but don't - hopefully it will be obsoleted as
- * old programs are update to check for PAGER so we can loose the overhead of
- * reexecuting even this small program ...
- *
- * Casey Leedom (lll-crg.arpa!csustan!casey) - 5/29/86
- */
-
- #ifndef OLD_PAGER_NEW_LOCATION
- # define OLD_PAGER_NEW_LOCATION "/usr/ucb/More"
- #endif !OLD_PAGER_NEW_LOCATION
-
- void
- main(argc, argv)
- int argc;
- char **argv;
- {
- char *pager, *getenv();
-
- if (!(pager = getenv("PAGER")))
- pager = OLD_PAGER_NEW_LOCATION;
- (void) execv(pager, argv);
- }
- SHAR_EOF
- fi
- if test -f 'makefile.bsd41'
- then
- echo shar: "will not over-write existing file 'makefile.bsd41'"
- else
- cat << \SHAR_EOF > 'makefile.bsd41'
- # Makefile for "less"
- #
- # Invoked as:
- # make all
- # or make install
- # Plain "make" is equivalent to "make all".
- #
- # If you add or delete functions, remake funcs.h by doing:
- # make newfuncs
- # This depends on the coding convention of function headers looking like:
- # " \t public <function-type> \n <function-name> ( ... ) "
- #
- # Also provided:
- # make lint # Runs "lint" on all the sources.
- # make clean # Removes "less" and the .o files.
- # make clobber # Pretty much the same as make "clean".
- #
- # make pager_patch # makes PAGER environment variable
- # make install_pager_patch # catcher and installs it (see below)
-
- ##########################################################################
- # System-specific parameters
- ##########################################################################
-
- # Define XENIX if running under XENIX 3.0
- XENIX = 0
-
- # VOID is 1 if your C compiler supports the "void" type,
- # 0 if it does not.
- VOID = 1
-
- # off_t is the type which lseek() returns.
- # It is also the type of lseek()'s second argument.
- off_t = long
-
- # TERMIO is 1 if your system has /usr/include/termio.h.
- # This is normally the case for System 5.
- # If TERMIO is 0 your system must have /usr/include/sgtty.h.
- # This is normally the case for BSD.
- TERMIO = 0
-
- # SIGSETMASK is 1 if your system has the sigsetmask() call.
- # This is normally the case only for BSD 4.2,
- # not for BSD 4.1 or System 5.
- SIGSETMASK = 0
-
-
- ##########################################################################
- # Optional and semi-optional features
- ##########################################################################
-
- # REGCMP is 1 if your system has the regcmp() function.
- # This is normally the case for System 5.
- # RECOMP is 1 if your system has the re_comp() function.
- # This is normally the case for BSD.
- # If neither is 1, pattern matching is supported, but without metacharacters.
- REGCMP = 0
- RECOMP = 1
-
- # SHELL_ESCAPE is 1 if you wish to allow shell escapes.
- # (This is possible only if your system supplies the system() function.)
- SHELL_ESCAPE = 0
-
- # EDITOR is 1 if you wish to allow editor invocation (the "v" command).
- # (This is possible only if your system supplies the system() function.)
- # EDIT_PGM is the name of the (default) editor to be invoked.
- EDITOR = 0
- EDIT_PGM = /usr/ucb/vi
-
- # parameters to "make install_pager_patch". OLD_PAGER will be moved to
- # OLD_PAGER_NEW_LOCATION and pager_patch (in this directory) will be installed
- # as OLD_PAGER. This patch will allow you to set the environment variable
- # PAGER to specify your personal pager preference (is this a security hole?)
- OLD_PAGER = /usr/ucb/more
- OLD_PAGER_NEW_LOCATION = /usr/ucb/More
-
- # ONLY_RETURN is 1 if you want RETURN to be the only input which
- # will continue past an error message.
- # Otherwise, any key will continue past an error message.
- ONLY_RETURN = 0
-
-
- ##########################################################################
- # Compilation environment.
- ##########################################################################
-
- # LIBS is the list of libraries needed.
- LIBS = -ltermcap
-
- # INSTALL_LESS is a list of the public versions of less.
- # INSTALL_MAN is a list of the public versions of the manual page.
- INSTALL_LESS = /usr/local/less
- INSTALL_MAN = /usr/man/manl/less.l
-
- # OPTIM is passed to the compiler and the loader.
- # It is normally "-O" but may be, for example, "-g".
- OPTIM = -O
-
-
- ##########################################################################
- # Files
- ##########################################################################
-
- SRC1 = main.c option.c prim.c
- SRC2 = ch.c position.c input.c output.c screen.c \
- prompt.c line.c signal.c help.c ttyin.c command.c version.c
- SRC = $(SRC1) $(SRC2)
- OBJ = main.o option.o prim.o ch.o position.o input.o output.o screen.o \
- prompt.o line.o signal.o help.o ttyin.o command.o version.o
-
-
- ##########################################################################
- # Rules
- ##########################################################################
-
- DEFS = "-DTERMIO=$(TERMIO)" \
- "-DSIGSETMASK=$(SIGSETMASK)" \
- "-Doff_t=$(off_t)" "-DVOID=$(VOID)" \
- "-DREGCMP=$(REGCMP)" "-DRECOMP=$(RECOMP)" \
- "-DSHELL_ESCAPE=$(SHELL_ESCAPE)" \
- "-DEDITOR=$(EDITOR)" "-DEDIT_PGM=\"$(EDIT_PGM)\"" \
- "-DONLY_RETURN=$(ONLY_RETURN)" \
- "-DXENIX=$(XENIX)" \
- "-DOLD_PAGER_NEW_LOCATION=\"$(OLD_PAGER_NEW_LOCATION)\""
-
- CFLAGS = $(OPTIM) $(DEFS)
-
-
- all: less
-
- less: $(OBJ)
- cc $(OPTIM) -o less $(OBJ) $(LIBS)
-
- install: install_man install_less
-
- install_man: less.l
- for f in $(INSTALL_MAN); do rm -f $$f; cp less.l $$f; done
- touch install_man
-
- install_less: less
- for f in $(INSTALL_LESS); do rm -f $$f; cp less $$f; done
- touch install_less
-
- pager_patch: pager_patch.c
- cc $(CFLAGS) -s -o pager_patch pager_patch.c
-
- install_pager_patch: pager_patch
- if [ -s $(OLD_PAGER) -a ! -s $(OLD_PAGER_NEW_LOCATION) ]; then \
- mv $(OLD_PAGER) $(OLD_PAGER_NEW_LOCATION); \
- cp pager_patch $(OLD_PAGER); \
- fi
- touch install_pager_patch
-
- $(OBJ): less.h funcs.h
-
- lint:
- lint -hp $(DEFS) $(SRC)
-
- newfuncs:
- mv funcs.h funcs.h.OLD
- awk -f mkfuncs.awk $(SRC) >funcs.h
-
- clean:
- rm -f $(OBJ) less pager_patch
-
- clobber:
- rm -f *.o less pager_patch install_less install_man install_pager_patch
-
- shar:
- shar -v INSTALLATION less.l makefile.* *.h *.awk $(SRC1) > less.shar.a
- shar -v $(SRC2) pager_patch.c > less.shar.b
- SHAR_EOF
- fi
- if test -f 'makefile.bsd42'
- then
- echo shar: "will not over-write existing file 'makefile.bsd42'"
- else
- cat << \SHAR_EOF > 'makefile.bsd42'
- # Makefile for "less"
- #
- # Invoked as:
- # make all
- # or make install
- # Plain "make" is equivalent to "make all".
- #
- # If you add or delete functions, remake funcs.h by doing:
- # make newfuncs
- # This depends on the coding convention of function headers looking like:
- # " \t public <function-type> \n <function-name> ( ... ) "
- #
- # Also provided:
- # make lint # Runs "lint" on all the sources.
- # make clean # Removes "less" and the .o files.
- # make clobber # Pretty much the same as make "clean".
- #
- # make pager_patch # makes PAGER environment variable
- # make install_pager_patch # catcher and installs it (see below)
-
-
- ##########################################################################
- # System-specific parameters
- ##########################################################################
-
- # Define XENIX if running under XENIX 3.0
- XENIX = 0
-
- # VOID is 1 if your C compiler supports the "void" type,
- # 0 if it does not.
- VOID = 1
-
- # off_t is the type which lseek() returns.
- # It is also the type of lseek()'s second argument.
- off_t = long
-
- # TERMIO is 1 if your system has /usr/include/termio.h.
- # This is normally the case for System 5.
- # If TERMIO is 0 your system must have /usr/include/sgtty.h.
- # This is normally the case for BSD.
- TERMIO = 0
-
- # SIGSETMASK is 1 if your system has the sigsetmask() call.
- # This is normally the case only for BSD 4.2,
- # not for BSD 4.1 or System 5.
- SIGSETMASK = 1
-
-
- ##########################################################################
- # Optional and semi-optional features
- ##########################################################################
-
- # REGCMP is 1 if your system has the regcmp() function.
- # This is normally the case for System 5.
- # RECOMP is 1 if your system has the re_comp() function.
- # This is normally the case for BSD.
- # If neither is 1, pattern matching is supported, but without metacharacters.
- REGCMP = 0
- RECOMP = 1
-
- # SHELL_ESCAPE is 1 if you wish to allow shell escapes.
- # (This is possible only if your system supplies the system() function.)
- SHELL_ESCAPE = 0
-
- # EDITOR is 1 if you wish to allow editor invocation (the "v" command).
- # (This is possible only if your system supplies the system() function.)
- # EDIT_PGM is the name of the (default) editor to be invoked.
- EDITOR = 0
- EDIT_PGM = /usr/ucb/vi
-
- # parameters to "make install_pager_patch". OLD_PAGER will be moved to
- # OLD_PAGER_NEW_LOCATION and pager_patch (in this directory) will be installed
- # as OLD_PAGER. This patch will allow you to set the environment variable
- # PAGER to specify your personal pager preference (is this a security hole?)
- OLD_PAGER = /usr/ucb/more
- OLD_PAGER_NEW_LOCATION = /usr/ucb/More
-
- # ONLY_RETURN is 1 if you want RETURN to be the only input which
- # will continue past an error message.
- # Otherwise, any key will continue past an error message.
- ONLY_RETURN = 0
-
-
- ##########################################################################
- # Compilation environment.
- ##########################################################################
-
- # LIBS is the list of libraries needed.
- LIBS = -ltermcap
-
- # INSTALL_LESS is a list of the public versions of less.
- # INSTALL_MAN is a list of the public versions of the manual page.
- INSTALL_LESS = /usr/local/less
- INSTALL_MAN = /usr/man/manl/less.l
-
- # OPTIM is passed to the compiler and the loader.
- # It is normally "-O" but may be, for example, "-g".
- OPTIM = -O
-
-
- ##########################################################################
- # Files
- ##########################################################################
-
- SRC1 = main.c option.c prim.c
- SRC2 = ch.c position.c input.c output.c screen.c \
- prompt.c line.c signal.c help.c ttyin.c command.c version.c
- SRC = $(SRC1) $(SRC2)
- OBJ = main.o option.o prim.o ch.o position.o input.o output.o screen.o \
- prompt.o line.o signal.o help.o ttyin.o command.o version.o
-
-
- ##########################################################################
- # Rules
- ##########################################################################
-
- DEFS = "-DTERMIO=$(TERMIO)" \
- "-DSIGSETMASK=$(SIGSETMASK)" \
- "-Doff_t=$(off_t)" "-DVOID=$(VOID)" \
- "-DREGCMP=$(REGCMP)" "-DRECOMP=$(RECOMP)" \
- "-DSHELL_ESCAPE=$(SHELL_ESCAPE)" \
- "-DEDITOR=$(EDITOR)" "-DEDIT_PGM=\"$(EDIT_PGM)\"" \
- "-DONLY_RETURN=$(ONLY_RETURN)" \
- "-DXENIX=$(XENIX)" \
- "-DOLD_PAGER_NEW_LOCATION=\"$(OLD_PAGER_NEW_LOCATION)\""
-
- CFLAGS = $(OPTIM) $(DEFS)
-
-
- all: less
-
- less: $(OBJ)
- cc $(OPTIM) -o less $(OBJ) $(LIBS)
-
- install: install_man install_less
-
- install_man: less.l
- for f in $(INSTALL_MAN); do rm -f $$f; cp less.l $$f; done
- touch install_man
-
- install_less: less
- for f in $(INSTALL_LESS); do rm -f $$f; cp less $$f; done
- touch install_less
-
- pager_patch: pager_patch.c
- cc $(CFLAGS) -s -o pager_patch pager_patch.c
-
- install_pager_patch: pager_patch
- if [ -s $(OLD_PAGER) -a ! -s $(OLD_PAGER_NEW_LOCATION) ]; then \
- mv $(OLD_PAGER) $(OLD_PAGER_NEW_LOCATION); \
- cp pager_patch $(OLD_PAGER); \
- fi
- touch install_pager_patch
-
- $(OBJ): less.h funcs.h
-
- lint:
- lint -hp $(DEFS) $(SRC)
-
- newfuncs:
- mv funcs.h funcs.h.OLD
- awk -f mkfuncs.awk $(SRC) >funcs.h
-
- clean:
- rm -f $(OBJ) less pager_patch
-
- clobber:
- rm -f *.o less pager_patch install_less install_man install_pager_patch
-
- shar:
- shar -v INSTALLATION less.l makefile.* *.h *.awk $(SRC1) > less.shar.a
- shar -v $(SRC2) pager_patch.c > less.shar.b
- SHAR_EOF
- fi
- if test -f 'makefile.sys5'
- then
- echo shar: "will not over-write existing file 'makefile.sys5'"
- else
- cat << \SHAR_EOF > 'makefile.sys5'
- # Makefile for "less"
- #
- # Invoked as:
- # make all
- # or make install
- # Plain "make" is equivalent to "make all".
- #
- # If you add or delete functions, remake funcs.h by doing:
- # make newfuncs
- # This depends on the coding convention of function headers looking like:
- # " \t public <function-type> \n <function-name> ( ... ) "
- #
- # Also provided:
- # make lint # Runs "lint" on all the sources.
- # make clean # Removes "less" and the .o files.
- # make clobber # Pretty much the same as make "clean".
- #
- # make pager_patch # makes PAGER environment variable
- # make install_pager_patch # catcher and installs it (see below)
-
-
- ##########################################################################
- # System-specific parameters
- ##########################################################################
-
- # Define XENIX if running under XENIX 3.0
- XENIX = 0
-
- # VOID is 1 if your C compiler supports the "void" type,
- # 0 if it does not.
- VOID = 1
-
- # off_t is the type which lseek() returns.
- # It is also the type of lseek()'s second argument.
- off_t = long
-
- # TERMIO is 1 if your system has /usr/include/termio.h.
- # This is normally the case for System 5.
- # If TERMIO is 0 your system must have /usr/include/sgtty.h.
- # This is normally the case for BSD.
- TERMIO = 1
-
- # SIGSETMASK is 1 if your system has the sigsetmask() call.
- # This is normally the case only for BSD 4.2,
- # not for BSD 4.1 or System 5.
- SIGSETMASK = 0
-
-
- ##########################################################################
- # Optional and semi-optional features
- ##########################################################################
-
- # REGCMP is 1 if your system has the regcmp() function.
- # This is normally the case for System 5.
- # RECOMP is 1 if your system has the re_comp() function.
- # This is normally the case for BSD.
- # If neither is 1, pattern matching is supported, but without metacharacters.
- REGCMP = 1
- RECOMP = 0
-
- # SHELL_ESCAPE is 1 if you wish to allow shell escapes.
- # (This is possible only if your system supplies the system() function.)
- SHELL_ESCAPE = 0
-
- # EDITOR is 1 if you wish to allow editor invocation (the "v" command).
- # (This is possible only if your system supplies the system() function.)
- # EDIT_PGM is the name of the (default) editor to be invoked.
- EDITOR = 0
- EDIT_PGM = /usr/ucb/vi
-
- # parameters to "make install_pager_patch". OLD_PAGER will be moved to
- # OLD_PAGER_NEW_LOCATION and pager_patch (in this directory) will be installed
- # as OLD_PAGER. This patch will allow you to set the environment variable
- # PAGER to specify your personal pager preference (is this a security hole?)
- OLD_PAGER = /usr/ucb/more
- OLD_PAGER_NEW_LOCATION = /usr/ucb/More
-
- # ONLY_RETURN is 1 if you want RETURN to be the only input which
- # will continue past an error message.
- # Otherwise, any key will continue past an error message.
- ONLY_RETURN = 0
-
-
- ##########################################################################
- # Compilation environment.
- ##########################################################################
-
- # LIBS is the list of libraries needed.
- LIBS = -lcurses -lPW
-
- # INSTALL_LESS is a list of the public versions of less.
- # INSTALL_MAN is a list of the public versions of the manual page.
- INSTALL_LESS = /usr/lbin/less
- INSTALL_MAN = /usr/man/manl/less.l
-
- # OPTIM is passed to the compiler and the loader.
- # It is normally "-O" but may be, for example, "-g".
- OPTIM = -O
-
-
- ##########################################################################
- # Files
- ##########################################################################
-
- SRC1 = main.c option.c prim.c
- SRC2 = ch.c position.c input.c output.c screen.c \
- prompt.c line.c signal.c help.c ttyin.c command.c version.c
- SRC = $(SRC1) $(SRC2)
- OBJ = main.o option.o prim.o ch.o position.o input.o output.o screen.o \
- prompt.o line.o signal.o help.o ttyin.o command.o version.o
-
-
- ##########################################################################
- # Rules
- ##########################################################################
-
- DEFS = "-DTERMIO=$(TERMIO)" \
- "-DSIGSETMASK=$(SIGSETMASK)" \
- "-Doff_t=$(off_t)" "-DVOID=$(VOID)" \
- "-DREGCMP=$(REGCMP)" "-DRECOMP=$(RECOMP)" \
- "-DSHELL_ESCAPE=$(SHELL_ESCAPE)" \
- "-DEDITOR=$(EDITOR)" "-DEDIT_PGM=\"$(EDIT_PGM)\"" \
- "-DONLY_RETURN=$(ONLY_RETURN)" \
- "-DXENIX=$(XENIX)" \
- "-DOLD_PAGER_NEW_LOCATION=\"$(OLD_PAGER_NEW_LOCATION)\""
-
- CFLAGS = $(OPTIM) $(DEFS)
-
-
- all: less
-
- less: $(OBJ)
- cc $(OPTIM) -o less $(OBJ) $(LIBS)
-
- install: install_man install_less
-
- install_man: less.l
- for f in $(INSTALL_MAN); do rm -f $$f; cp less.l $$f; done
- touch install_man
-
- install_less: less
- for f in $(INSTALL_LESS); do rm -f $$f; cp less $$f; done
- touch install_less
-
- pager_patch: pager_patch.c
- cc $(CFLAGS) -s -o pager_patch pager_patch.c
-
- install_pager_patch: pager_patch
- if [ -s $(OLD_PAGER) -a ! -s $(OLD_PAGER_NEW_LOCATION) ]; then \
- mv $(OLD_PAGER) $(OLD_PAGER_NEW_LOCATION); \
- cp pager_patch $(OLD_PAGER); \
- fi
- touch install_pager_patch
-
- $(OBJ): less.h funcs.h
-
- lint:
- lint -hp $(DEFS) $(SRC)
-
- newfuncs:
- mv funcs.h funcs.h.OLD
- awk -f mkfuncs.awk $(SRC) >funcs.h
-
- clean:
- rm -f $(OBJ) less pager_patch
-
- clobber:
- rm -f *.o less pager_patch install_less install_man install_pager_patch
-
- shar:
- shar -v INSTALLATION less.l makefile.* *.h *.awk $(SRC1) > less.shar.a
- shar -v $(SRC2) pager_patch.c > less.shar.b
- SHAR_EOF
- fi
- if test -f 'makefile.xen'
- then
- echo shar: "will not over-write existing file 'makefile.xen'"
- else
- cat << \SHAR_EOF > 'makefile.xen'
- # Makefile for "less"
- #
- # Invoked as:
- # make all
- # or make install
- # Plain "make" is equivalent to "make all".
- #
- # If you add or delete functions, remake funcs.h by doing:
- # make newfuncs
- # This depends on the coding convention of function headers looking like:
- # " \t public <function-type> \n <function-name> ( ... ) "
- #
- # Also provided:
- # make lint # Runs "lint" on all the sources.
- # make clean # Removes "less" and the .o files.
- # make clobber # Pretty much the same as make "clean".
- #
- # make pager_patch # makes PAGER environment variable
- # make install_pager_patch # catcher and installs it (see below)
-
-
- ##########################################################################
- # System-specific parameters
- ##########################################################################
-
- # Define XENIX if running under XENIX 3.0
- XENIX = 1
-
- # VOID is 1 if your C compiler supports the "void" type,
- # 0 if it does not.
- VOID = 1
-
- # off_t is the type which lseek() returns.
- # It is also the type of lseek()'s second argument.
- off_t = long
-
- # TERMIO is 1 if your system has /usr/include/termio.h.
- # This is normally the case for System 5.
- # If TERMIO is 0 your system must have /usr/include/sgtty.h.
- # This is normally the case for BSD.
- TERMIO = 1
-
- # SIGSETMASK is 1 if your system has the sigsetmask() call.
- # This is normally the case only for BSD 4.2,
- # not for BSD 4.1 or System 5.
- SIGSETMASK = 0
-
-
- ##########################################################################
- # Optional and semi-optional features
- ##########################################################################
-
- # REGCMP is 1 if your system has the regcmp() function.
- # This is normally the case for System 5.
- # RECOMP is 1 if your system has the re_comp() function.
- # This is normally the case for BSD.
- # If neither is 1, pattern matching is supported, but without metacharacters.
- REGCMP = 1
- RECOMP = 0
-
- # SHELL_ESCAPE is 1 if you wish to allow shell escapes.
- # (This is possible only if your system supplies the system() function.)
- SHELL_ESCAPE = 0
-
- # EDITOR is 1 if you wish to allow editor invocation (the "v" command).
- # (This is possible only if your system supplies the system() function.)
- # EDIT_PGM is the name of the (default) editor to be invoked.
- EDITOR = 0
- EDIT_PGM = /usr/ucb/vi
-
- # parameters to "make install_pager_patch". OLD_PAGER will be moved to
- # OLD_PAGER_NEW_LOCATION and pager_patch (in this directory) will be installed
- # as OLD_PAGER. This patch will allow you to set the environment variable
- # PAGER to specify your personal pager preference (is this a security hole?)
- OLD_PAGER = /usr/ucb/more
- OLD_PAGER_NEW_LOCATION = /usr/ucb/More
-
- # ONLY_RETURN is 1 if you want RETURN to be the only input which
- # will continue past an error message.
- # Otherwise, any key will continue past an error message.
- ONLY_RETURN = 0
-
-
- ##########################################################################
- # Compilation environment.
- ##########################################################################
-
- # LIBS is the list of libraries needed.
- LIBS = -lcurses -ltermlib
-
- # INSTALL_LESS is a list of the public versions of less.
- # INSTALL_MAN is a list of the public versions of the manual page.
- INSTALL_LESS = /usr/lbin/less
- INSTALL_MAN = /usr/man/manl/less.l
-
- # OPTIM is passed to the compiler and the loader.
- # It is normally "-O" but may be, for example, "-g".
- OPTIM = -O
-
-
- ##########################################################################
- # Files
- ##########################################################################
-
- SRC1 = main.c option.c prim.c
- SRC2 = ch.c position.c input.c output.c screen.c \
- prompt.c line.c signal.c help.c ttyin.c command.c version.c
- SRC = $(SRC1) $(SRC2)
- OBJ = main.o option.o prim.o ch.o position.o input.o output.o screen.o \
- prompt.o line.o signal.o help.o ttyin.o command.o version.o
-
-
- ##########################################################################
- # Rules
- ##########################################################################
-
- DEFS = "-DTERMIO=$(TERMIO)" \
- "-DSIGSETMASK=$(SIGSETMASK)" \
- "-Doff_t=$(off_t)" "-DVOID=$(VOID)" \
- "-DREGCMP=$(REGCMP)" "-DRECOMP=$(RECOMP)" \
- "-DSHELL_ESCAPE=$(SHELL_ESCAPE)" \
- "-DEDITOR=$(EDITOR)" "-DEDIT_PGM=\"$(EDIT_PGM)\"" \
- "-DONLY_RETURN=$(ONLY_RETURN)" \
- "-DXENIX=$(XENIX)" \
- "-DOLD_PAGER_NEW_LOCATION=\"$(OLD_PAGER_NEW_LOCATION)\""
-
- CFLAGS = $(OPTIM) $(DEFS)
-
-
- all: less
-
- less: $(OBJ)
- cc $(OPTIM) -o less $(OBJ) $(LIBS)
-
- install: install_man install_less
-
- install_man: less.l
- for f in $(INSTALL_MAN); do rm -f $$f; cp less.l $$f; done
- touch install_man
-
- install_less: less
- for f in $(INSTALL_LESS); do rm -f $$f; cp less $$f; done
- touch install_less
-
- pager_patch: pager_patch.c
- cc $(CFLAGS) -s -o pager_patch pager_patch.c
-
- install_pager_patch: pager_patch
- if test -s $(OLD_PAGER) -a ! -s $(OLD_PAGER_NEW_LOCATION) ; then \
- mv $(OLD_PAGER) $(OLD_PAGER_NEW_LOCATION); \
- cp pager_patch $(OLD_PAGER); \
- fi
- touch install_pager_patch
-
- $(OBJ): less.h funcs.h
-
- lint:
- lint -hp $(DEFS) $(SRC)
-
- newfuncs:
- mv funcs.h funcs.h.OLD
- awk -f mkfuncs.awk $(SRC) >funcs.h
-
- clean:
- rm -f $(OBJ) less pager_patch
-
- clobber:
- rm -f *.o less pager_patch install_less install_man install_pager_patch
-
- shar:
- shar -v INSTALLATION less.l makefile.* *.h *.awk $(SRC1) > less.shar.a
- shar -v $(SRC2) pager_patch.c > less.shar.b
- SHAR_EOF
- fi
- exit 0
- # End of shell archive
-
-
-